#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std;

struct BONE
{
	int val;
	int vol;
}bone[1005];
int dp[1010][1001];
int T, N, V;
int dp1[1001];
//int ans()
//{
//	memset(dp, 0, sizeof(dp));
//	for (int i = 1; i <= N; i++) {
//		for (int j = 0; j <= V; j++)
//			if (bone[i].vol > j)dp[i][j] = dp[i - 1][j];
//			else
//				dp[i][j] = max(dp[i - 1][j],
//					dp[i - 1][j - bone[i].vol] + bone[i].val);
//	}
//	return dp[N][V];
//}

int ans()
{
	memset(dp1, 0, sizeof(dp1));
	for (int i = 1; i <= N; i++) {
		for (int j = V; j >= bone[i].vol; j--)
			dp1[j] = max(dp1[j], dp1[j - bone[i].vol] + bone[i].val);
	}
	return dp1[V];
}

//void PrintScheme()
//{
//	int rem = dp[N][V];
//	int j = V;
//	for (int i = N; i > 0; i--) {
//		if (rem == dp[i - 1][j]);
//		else if (rem == dp[i - 1][j - bone[i].vol] + bone[i].val) {
//			rem -= bone[i].val;
//			cout << bone[i].val << " ";
//		}
//	}
//
//}

int main()
{
	cin >> T;
	while (T--) {
		cin >> N >> V;
		for (int i = 1; i <= N; i++) scanf("%d", &bone[i].val);
		for (int i = 1; i <= N; i++)scanf("%d", &bone[i].vol);
		cout << ans() << endl;
		//PrintScheme();
	}
	return 0;
}